#include "compile_run.hpp"
#include "../comm/httplib.h"
#include <cstring>

// #include "compiler.hpp"
// #include "runner.hpp"
// #include "../comm/Log.hpp"
// #include "../comm/Util.hpp"

using namespace compile_and_run_ns;
using namespace httplib;

// using namespace log_ns;
// using namespace util_ns;
// using namespace compiler_ns;
// using namespace runner_ns;

// 编译服务可能被多个用户请求，必须保证上传的code，
// 形成源文件时，具有唯一性，不然多个用户会互相影响
void Usage(std::string proc)
{
    std::cout << "Usage: " << "\n\t" << proc << " +port" << std::endl;
}
int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        Usage(argv[0]);
        return 1;
    }

    // 通过http(网络), 客户端给我们上传一个 json string
    Server svr;

    // svr.Get("/hello", [](const Request &req, Response &resp){
    //     // 用来进行测试
    //     resp.set_content("好好好yss", "text/plain;charset=utf-8");
    // });

    svr.Post("/Compile_Run", [](const Request &req, Response &resp){
        // 用户请求的正文就是我们要的json串
        std::string in_json = req.body;
        std::string out_json;
        if(!in_json.empty())
        {
            Compile_Run::Start(in_json, &out_json);
            resp.set_content(out_json, "application/json;charset=utf-8");
        }
    });

    // svr.set_base_dir("./wwwroot");
    svr.listen("0.0.0.0", std::stoi(argv[1])); // 启动http服务 



    // 简单测试
    // std::string code = "code";
    // int cpu_limit = 1;
    // int mem_limit = 10240 * 3;
    // Compiler::Compile(code);
    // Runner::Run(code, cpu_limit, mem_limit);


    // 自定义的 客户端给我们上传一个 json string
    // std::string in_json;
    // Json::Value in_value;
    // in_value["code"] = R"(#include <iostream>
    // int main(){
    // std::cout<<"哈哈哈哈哈 hello yss"<<std::endl;
    // return 0;
    // })";
    // in_value["input"] = "";
    // in_value["cpu_limit"] = 1;
    // in_value["mem_limit"] = 10240 * 3;

    // Json::FastWriter write;
    // in_json = write.write(in_value);
    // std::cout << in_json << std::endl;

    // // 给客户端返回的json串
    // std::string out_json;
    // Compile_Run::Start(in_json, &out_json);
    // std::cout << out_json << std::endl;

    return 0;
}